import axios from "axios";
import { Message } from "element-ui";
import store from '@/store'
const TimeOut = 5400
import router from "@/router";
import { getTimeStamp } from "./auth";

const service = axios.create({
   // 设置axios请求的基础的基础地址
   baseURL: process.env.VUE_APP_BASE_API,
   timeout: 5000
})

// 请求拦截器
service.interceptors.request.use(
   // 所有请求发出去之前，先经过这个函数进行拦截处理
   (config) => {
      // 在请求之前注入token
      // 存在token时才注入 不存在就不注入
      if (store.getters.token) {
         // 只要有token,就要检查token的时效
         // 解决token失效的主动介入
         if(CheckIsTimeOut()) {
            // 如果为true  表示过期了
            store.dispatch('user/logout')  //登出操作
            // 跳转到登录页
            router.push('/login')
            return Promise.reject(new Error('token超时了'))
         }

         // 方法1：合并headers  实现headers里面增加 Authorization 字段
         // const authHeaders = {
         //    Authorization : `Bearer ${store.getters.token}`
         // }
         // config.headers = {...config.headers,...authHeaders}
         // 方法2：直接指定
         config.headers.Authorization = `Bearer ${store.getters.token}`
      }
      // 返回config是必须的，不能省略，如果省略，请求将无法发送
      return config
   }, error => {
      // 提示错误信息
      Message.error(error.message)
      // 返回执行错误  让当前的执行链跳出成功直接进入catch
      return Promise.reject(error)
   })


// 响应拦截器
service.interceptors.response.use(response => {
   // axios 默认添加了一层data
   const { success, message, data } = response.data
   if (success) {
      return data  //返回的是一个Promise 会把它包装成Promise
   } else {
      // 如果错误的话是不能进then的   应该进catch
      Message.error(message)  //提示错误信息
      return Promise.reject(new Error(message))
   }
}, async error => {
   // 解决token失效的被动处理
   // error 有response对象 config
   // if(error.response? error.response.data? error.response.data.code === 10002) 
   if(error.response && error.response.data && error.response.data.code === 10002) {
      await store.dispatch('user/logout')  //调用action
      router.push('/login')  //跳转到登录页
   }

   // 提示错误信息
   Message.error(error.message)
   // 返回执行错误  让当前的执行链跳出成功直接进入catch
   return Promise.reject(error)
})

// 检查token 是否过期
function CheckIsTimeOut() {
   // 当前时间-存储的时间戳 > 时效性
   return (Date.now() - getTimeStamp()) / 1000 > TimeOut
}

export default service